package com.chisheng.caa.util;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 数学工具类
 */
public final class MathUtil {

    private MathUtil() {
        throw new UnsupportedOperationException();
    }

    /**
     * 求给定数值列表中的最小值。
     *
     * @param arr 列表
     * @return 最小值
     */
    public static int min(int... arr) {
        if (arr.length == 0) {
            throw new IllegalArgumentException("给定的数值个数不能小于 0");
        }

        int minIdx = 0;
        for (int i = 1; i < arr.length; i++) {
            if (arr[minIdx] > arr[i]) {
                minIdx = i;
            }
        }

        return arr[minIdx];
    }

    /**
     * 获取一定范围的整数列表。生成的步长为 1.
     */
    public static List<Integer> range(int start, int end) {
        return range(start, end, 1);
    }

    /**
     * 获取一定范围的整数列表。
     *
     * @param start 起始值（包含）
     * @param end   结束值（不包含）
     * @param step  步长
     * @return 整数序列
     */
    public static List<Integer> range(int start, int end, int step) {
        List<Integer> l = new ArrayList<>((end - start) / end);
        for (int i = start; i < end; i += step) {
            l.add(i);
        }

        return l;
    }

    /**
     * 求并集。
     *
     * @param a 集合 1
     * @param b 集合 2
     * @return 并集
     */
    public static <T> List<T> union(List<? extends T> a, List<? extends T> b) {
        List<T> l = new ArrayList<>(a);
        l.addAll(b);
        return l;
    }

    /**
     * 集合去重。
     *
     * @param arr 去重集合
     * @param <T> 集合元素类型
     * @return 去重后新的集合
     */
    public static <T> List<T> distinct(List<T> arr) {
        return arr.stream().distinct().collect(Collectors.toList());
    }

}
